home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 4
/
FM Towns Free Software Collection 4 - Disc 1.iso
/
fb386
/
tdp
/
tdp.bas
next >
Wrap
BASIC Source File
|
1991-10-18
|
14KB
|
365 lines
1000 '--------------------------------------------------------------------
1010 ' Basic Sample Program 1991.08.09
1020 '
1030 ' Tdp Ver 0.1
1040 ' by M.INOUE
1050 '--------------------------------------------------------------------
1060 CLEAR ,,4096
1070 DEFINT A-Z:DIM TXT$(5000),WIN(60000),MX1(10),MY1(10),MX2(10),MY2(10)
1080 '
1090 ON ERROR GOTO *エラー処理
1100 '
1110 GOSUB *初期画面表示
1120 '
1130 GOSUB *処理の振り分け : GOTO 1130
1140 END
1150 '
1160 '--------------------------------------------------------------------
1170 *初期画面表示
1180 '--------------------------------------------------------------------
1190 SCREEN@ 2 : CONSOLE 2,22,2 : COLOR 0,7 : CLS
1200 '
1210 RESTORE *カラー
1220 FOR Q=1 TO 8 STEP 1
1230 READ C1,P1,P2,P3 : PALETTE C1,[ P1,P2,P3 ]
1240 NEXT Q
1250 '
1260 LINE (2,2)-(638,32),PSET,%2,BF : LINE (1,31)-(638,32),PSET,%0,BF
1270 LINE (638,2)-(639,32),PSET,%0,BF
1280 COLOR 0,%0
1290 LINE (4,6)-(54,28),PSET,%0,B : LINE (4,5)-(53,27),PSET,%7,BF
1300 SYMBOL(5,7),"Tdp",.9!,.7!,%6,,,5,1
1310 SYMBOL(5,19),"Ver0.1",.7!,.5!,%6,,,5,2
1320 '
1330 RESTORE *機能
1340 XX1=60 : YY1=6
1350 FOR Q=1 TO 5 STEP 1
1360 READ Q1$,Q2$
1370 MX1(Q)=XX1 : MY1(Q)=YY1 : MX2(Q)=XX1+40 : MY2(Q)=YY1+21
1380 LINE (XX1,YY1)-(XX1+41,YY1+22),PSET,%0,B
1390 LINE (XX1,YY1-1)-(XX1+40,YY1+21),PSET,%1,BF
1400 SYMBOL(XX1+2,YY1+1),Q1$,1,.7!,%7,,,5,5
1410 SYMBOL(XX1+4,YY1+14),Q2$,1,.4!,%7,,,5
1420 XX1=XX1+44
1430 NEXT Q
1440 '
1450 SYMBOL(290,8),"行位置= - 行 使用量= 行( %)",1,1,7,,,5,1
1460 COLOR 0,7
1470 MOUSE 0 : MOUSE 1,,,1
1480 WN=1 : YY=1 : YM=21 : MAX=5000 : PMX=61 : PC$="Init" : FIL$=""
1490 KEY 1,CHR$(&H90) : KEY 4,CHR$(&H91) : KEY 5,CHR$(&H92)
1500 MK$=CHR$(&H90)+CHR$(&H91)+CHR$(&H92)+CHR$(&H1F)+CHR$(&H1E)
1510 RETURN
1520 '
1530 *機能
1540 DATA "終了","PF01"
1550 DATA "印刷","PF04"
1560 DATA "読込","PF05"
1570 DATA "次行"," ↓ "
1580 DATA "前行"," ↑ "
1590 '
1600 *カラー
1610 DATA 0,000,000,000 : '
1620 DATA 1,151,151,151 : '
1630 DATA 2,191,191,191 : '
1640 DATA 3,255,255,255 : '
1650 DATA 4,255,255,255 : '
1660 DATA 5,220,220,220 : '
1670 DATA 6,255,255,000 : '
1680 DATA 7,255,255,255 : '
1690 '
1700 '--------------------------------------------------------------------
1710 *処理の振り分け
1720 '--------------------------------------------------------------------
1730 K$=INKEY$ : IF K$<>"" THEN MQ=INSTR(MK$,K$) : IF MQ>0 THEN GOTO 1830
1740 '
1750 MSW=MOUSE(2,0) : IF MSW=0 THEN RETURN
1760 MSX=MOUSE(4,0) : MSY=MOUSE(5,0) : MSF=0 : MQ=1 : MQX=7
1770 WHILE MSF<>-1
1780 MSF=(MSX>MX1(MQ) AND MSX<MX2(MQ) AND MSY>MY1(MQ) AND MSY<MY2(MQ))
1790 MQ=MQ+1+MSF : MSF=(MQ>MQX OR MSF)
1800 WEND
1810 IF MQ>MQX THEN RETURN
1820 '
1830 ON MQ GOSUB *終了,*印刷,*読込,*スクロール,*逆スクロール,*確認,*取消
1840 RETURN
1850 '
1860 '--------------------------------------------------------------------
1870 *終了
1880 '--------------------------------------------------------------------
1890 IF PC$="Init" THEN PC$="End1" : GOTO *終了1
1900 IF PC$="Look" THEN PC$="End2" : GOTO *終了1
1910 RETURN
1920 *終了1
1930 CX=11 : CY=12 : WX=18 : WY=5 : WF$="w&c" : WP$="on"
1940 WM$="Tdpを終了するよ、いいかい!" : GOSUB *枠の表示
1950 IF WQK$="ok" THEN END
1960 IF PC$="End1" THEN PC$="Init" : RETURN
1970 IF PC$="End2" THEN PC$="Look" : RETURN
1980 RETURN
1990 '
2000 '--------------------------------------------------------------------
2010 *確認
2020 '--------------------------------------------------------------------
2030 WQK$="ok" : WQT$="" : K$=CHR$(&H94) : RETURN
2040 '
2050 '--------------------------------------------------------------------
2060 *取消
2070 '--------------------------------------------------------------------
2080 WQK$="no" : WQT$="2" : K$=CHR$(&H94) : RETURN
2090 '
2100 '--------------------------------------------------------------------
2110 *印刷
2120 '--------------------------------------------------------------------
2130 IF PC$="Look" THEN PC$="Print" ELSE RETURN
2140 CX=12 : CY=11 : WX=16 : WY=5 : WF$="w&c" : WP$="off"
2150 WM$="印刷を始めてもいい!" : GOSUB *枠の表示
2160 IF WQK$="no" THEN *印刷終了
2170 PT=1 : PG=1
2180 KANJI OFF
2190 LPRINT CHR$(&H0A);
2200 KANJI ON
2210 FOR J=1 TO I STEP 1
2220 LPRINT " ";TXT$(J)
2230 PT=PT+1 : IF PT>PMX THEN GOSUB *改頁 : LPRINT CHR$(&H0A);
2240 NEXT J
2250 IF PT<PMX THEN GOSUB *頁位置調整
2260 CX=13 : CY=13 : WX=14 : WY=5 : WF$="wait" : WP$="on"
2270 WM$="印刷が終わったよ!" : GOSUB *枠の表示
2280 *印刷終了
2290 CX=12 : CY=11 : WX=16 : WY=5 : WP$="put" : GOSUB *枠の表示
2300 PC$="Look" : RETURN
2310 '
2320 *改頁
2330 KANJI OFF
2340 LPRINT CHR$(&H0A);
2350 LPRINT SPACE$(37);"- ";PG;" -";CHR$(&H0C); : PG=PG+1 : PT=1
2360 KANJI ON
2370 RETURN
2380 '
2390 *頁位置調整
2400 KANJI OFF
2410 FOR J=1 TO PMX-PT+1 STEP 1 : LPRINT CHR$(&H0A); : NEXT : GOSUB *改頁
2420 KANJI ON
2430 RETURN
2440 '
2450 '--------------------------------------------------------------------
2460 *読込
2470 '--------------------------------------------------------------------
2480 IF PC$="Init" THEN PC$="File1" : GOTO *読込1
2490 IF PC$="Look" THEN PC$="File2" : GOTO *読込1
2500 RETURN
2510 *読込1
2520 FP$="off"
2530 CX=12 : CY=10 : WX=16 : WY=8 : WF$="input" : WP$=FP$ : FP$="or"
2540 WM$="ファイル名を入力してよ!" : WIO$=FIL$ : GOSUB *枠の表示
2550 IF WQK$="Can" THEN 2620
2560 '
2570 OPEN "I",#1,WI$ : I=0
2580 WHILE EOF(1)<>-1
2590 I=I+1 : IF I>MAX THEN GOTO 2610
2591 LINE INPUT#1,T$ : TXT$(I)=T$+SPACE$(79-LEN(T$))
2600 WEND
2610 CLOSE#1
2620 '
2630 CX=12 : CY=10 : WX=16 : WY=8 : WP$="put" : GOSUB *枠の表示
2640 IF WQK$="Can" AND PC$="File1" THEN PC$="Init" : RETURN
2650 IF WQK$="Can" AND PC$="File2" THEN PC$="Look" : RETURN
2660 '
2670 YY=1 : U=(I*100)/MAX : FIL$=WI$
2680 '
2690 COLOR 0,%2
2700 Y$=STR$(I):Y$=SPACE$(4-LEN(Y$))+Y$:SYMBOL(528,9),Y$,1,1,%7,,OPAQUE,1
2710 Y$=STR$(U):Y$=SPACE$(3-LEN(Y$))+Y$:SYMBOL(588,9),Y$,1,1,%7,,OPAQUE,1
2720 COLOR 0,%7
2730 GOSUB *内容表示
2740 PC$="Look" : RETURN
2750 '
2760 '--------------------------------------------------------------------
2770 *内容表示
2780 '--------------------------------------------------------------------
2790 COLOR 0,%7 : Y=1
2800 FOR J=YY TO YM+YY STEP 1
2810 Y=Y+1 : LOCATE 0,Y : PRINT TXT$(J);
2820 NEXT J
2830 GOSUB *行数表示 : RETURN
2840 '
2850 '--------------------------------------------------------------------
2860 *スクロール
2870 '--------------------------------------------------------------------
2880 IF PC$<>"Look" THEN RETURN
2890 COLOR 0,%7
2900 IF YY<I-YM THEN YY=YY+1 ELSE RETURN
2910 LOCATE 79,YM+2 : PRINT " ";
2920 LOCATE 0,YM+4 : PRINT TXT$(YM+YY);
2930 GOSUB *行数表示 : RETURN
2940 '
2950 '--------------------------------------------------------------------
2960 *逆スクロール
2970 '--------------------------------------------------------------------
2980 IF PC$<>"Look" THEN RETURN
2990 COLOR 0,%7
3000 IF YY>1 THEN YY=YY-1 ELSE RETURN
3010 LOCATE 0,2 : PRINT CHR$(&H1B)+"E";
3020 LOCATE 0,2 : PRINT TXT$(YY);
3030 GOSUB *行数表示 : RETURN
3040 '
3050 '--------------------------------------------------------------------
3060 *行数表示
3070 '--------------------------------------------------------------------
3080 COLOR 0,%2
3090 Y$=STR$(YY) : Y$=SPACE$(4-LEN(Y$))+Y$
3100 SYMBOL(354,9),Y$,1,1,%7,,OPAQUE,1
3110 Y$=STR$(YY+YM) : Y$=SPACE$(4-LEN(Y$))+Y$
3120 SYMBOL(398,9),Y$,1,1,%7,,OPAQUE,1
3130 COLOR 0,%7
3140 RETURN
3150 '
3160 '--------------------------------------------------------------------
3170 *エラー処理
3180 '--------------------------------------------------------------------
3190 IF ERL=2570 AND ERR=63 THEN GOSUB *ファイル無 : RESUME 2530
3200 IF ERL=2570 AND ERR=55 THEN GOSUB *ファイル違い : RESUME 2530
3210 IF ERL=2570 AND ERR=72 THEN GOSUB *装置使用不可 : RESUME 2530
3220 CX=11 : CY=10 : WX=18 : WY=5 : WF$="wait" : WP$="on"
3230 WM$="エラーがでたよ! 内容("+STR$(ERR)+")" : GOSUB *枠の表示 : END
3240 '
3250 *ファイル無
3260 CX=16 : CY=15 : WX=15 : WY=5 : WF$="wait" : WP$="on"
3270 WM$="ファイルがないよ!" : GOSUB *枠の表示 : RETURN
3280 '
3290 *ファイル違い
3300 CX=16 : CY=15 : WX=16 : WY=5 : WF$="wait" : WP$="on"
3310 WM$="ファイル名の書き方が違うよ!" : GOSUB *枠の表示 : RETURN
3320 '
3330 *装置使用不可
3340 CX=16 : CY=15 : WX=16 : WY=5 : WF$="wait" : WP$="on"
3350 WM$="ディスクがセットされてないよ!" : ER$=LEFT$(WI$,2)
3360 IF ER$="Q:" OR ER$="q:" THEN WM$="CDがセットされてないよ!"
3370 GOSUB *枠の表示 : RETURN
3380 '
3390 '--------------------------------------------------------------------
3400 *枠の表示
3410 ' CX=桁位置 CY=行位置 WX=桁数 WY=行数 WF$=表示モード
3420 ' WN=退避NO WP$=復元モード
3430 '--------------------------------------------------------------------
3440 HX=CX+WX : HY=CY+WY : WC$=STR$(WN)
3450 WWX1=CX*16 : WWY1=CY*16 : WWX2=HX*16 : WWY2=HY*16
3460 WWX3=WX*17 : WWY3=WY*17
3470 IF WX > WY THEN WW=(WY*16)/2 ELSE WW=(WX*16)/2
3480 IF WP$="put" THEN WN=WN-1 : GOSUB *枠の復元 : RETURN
3490 IF WP$="or" THEN *表示モード枠 ELSE GOSUB *枠の退避
3500 IF WP$="off" THEN WN=WN+1
3510 FOR EW=WW TO 1 STEP -1
3520 LINE (WWX1+EW,WWY1+EW)-(WWX2-EW,WWY2-EW),PSET,%2,B
3530 NEXT EW
3540 LINE (WWX1-1,WWY1-1)-(WWX2+1,WWY1+1),PSET,%7,BF
3550 LINE (WWX1-1,WWY1-1)-(WWX1+1,WWY2+1),PSET,%7,BF
3560 LINE (WWX1-2,WWY1-2)-(WWX2+1,WWY2+1),PSET,%0,B
3570 LINE (WWX1,WWY2)-(WWX2,WWY2),PSET,%0,BF
3580 LINE (WWX1+1,WWY2-1)-(WWX2,WWY2-1),PSET,%0,BF
3590 LINE (WWX2,WWY1)-(WWX2,WWY2),PSET,%0,BF
3600 LINE (WWX2-1,WWY1+1)-(WWX2-1,WWY2),PSET,%0,BF
3610 COLOR 0,%0
3620 SYMBOL(WWX1,WWY1+4),WC$,.5!,.5!,%6,,PSET,5
3630 SYMBOL(WWX1+16,WWY1+16),WM$,1,1,%7,,PSET,5
3640 COLOR 0,%7
3650 *表示モード枠
3660 IF WF$="wait" THEN GOSUB *確認要求
3670 IF WF$="w&c" THEN GOSUB *確認と取消
3680 IF WF$="input" THEN GOSUB *入力
3690 IF WP$="off" OR WP$="or" THEN RETURN
3700 GOSUB *枠の復元 : RETURN
3710 '
3720 *確認要求
3730 WRX=(CX+WX-6)*16+8 : WRY=(CY+WY-2)*16 : WQK$="ok"
3740 MX1(6)=WRX : MY1(6)=WRY : MX2(6)=WRX+74 : MY2(6)=WRY+18
3750 BQ=6 : BM$="わかった!" : GOSUB *ボタン表示 : GOSUB *ボタン押す
3760 GOSUB *処理の振り分け : IF K$="" THEN 3760 ELSE RETURN
3770 '
3780 *確認と取消
3790 WQX=(CX+WX-9)*16 : WQY=(CY+WY-2)*16 : WQK$="ok"
3800 MX1(6)=WQX-2 : MY1(6)=WQY-2 : MX2(6)=WQX+58 : MY2(6)=WQY+18
3810 MX1(7)=WQX+70 : MY1(7)=WQY-2 : MX2(7)=WQX+130 : MY2(7)=WQY+18
3820 BQ=6 : BM$="いいよ!" : GOSUB *ボタン表示 : GOSUB *ボタン押す
3830 BQ=7 : BM$="いやだ!" : GOSUB *ボタン表示
3840 GOSUB *処理の振り分け : IF K$="" THEN 3840
3850 IF K$=CHR$(&H1D) AND WQK$="no" THEN WQK$="ok" : WQT$="1"
3860 IF K$=CHR$(&H1C) AND WQK$="ok" THEN WQK$="no" : WQT$="2"
3870 IF K$=CHR$(&H0D) THEN WAIT 50 : GOTO 3920
3880 IF WQT$="1" THEN BQ=7 : GOSUB *ボタン押す : BQ=6 : GOSUB *ボタン戻す
3890 IF WQT$="2" THEN BQ=6 : GOSUB *ボタン押す : BQ=7 : GOSUB *ボタン戻す
3900 IF K$=CHR$(&H94) THEN WAIT 50 : GOTO 3920
3910 GOTO 3840
3920 MX1(6)=0 : MY1(6)=0 : MX2(6)=0 : MY2(6)=0
3930 MX1(7)=0 : MY1(7)=0 : MX2(7)=0 : MY2(7)=0 : K$="" : RETURN
3940 '
3950 *入力
3960 WIX=(CX+1)*16 : WIY=(CY+3)*16 : WICX=(CX+1)*2 : WICY=CY+1
3970 WIX2=(CX+WX-5)*16 : WIY2=(CY+WY-2)*16
3980 MX1(6)=WIX2-2 : MY1(6)=WIY2-2 : MX2(6)=WIX2+58 : MY2(6)=WIY2+18
3990 IF WP$="or" THEN GOTO 4080
4000 LINE (WIX-1,WIY-3)-((HX-1)*16,WIY+20),PSET,%7,BF
4010 LINE (WIX-2,WIY-4)-((HX-1)*16,WIY-4),PSET,%0,B
4020 LINE (WIX-2,WIY-3)-(WIX-2,WIY+20),PSET,%0,B
4030 BQ=6 : BM$="やめた!" : GOSUB *ボタン表示
4040 LINE(MX1(6)-1,MY1(6)-1)-(MX2(6)+1,MY2(6)+1),XOR,%0,BF
4050 WL=LEN(WIO$) : WMX=WX*2-4 : WML=WMX-LEN(WIO$) : WQK$="" : WS=WL
4060 LOCATE WICX,WICY : PRINT WIO$;SPACE$(WML);
4070 LINE (WIX+WS*8,WIY+19)-(WIX+WS*8+8,WIY+19),XOR,%255
4080 GOSUB *処理の振り分け : IF K$="" OR K$=CHR$(&H7F) THEN GOTO 4080
4090 IF K$=CHR$(&H0D) THEN GOSUB *入力終了処理 : RETURN
4100 IF K$=CHR$(&H18) OR K$=CHR$(&H94) THEN GOSUB *入力中止処理 : RETURN
4110 IF K$=CHR$(&H1D) OR K$=CHR$(&H1C) THEN GOSUB *カーソル移動処理
4120 IF K$=CHR$(&H08) THEN GOSUB *一文字前削除処理
4130 IF K$>CHR$(&H20) AND K$<CHR$(&HE0) THEN GOSUB *入力処理
4140 GOTO 4080
4150 '
4160 *入力処理
4170 LINE (WIX+WS*8,WIY+19)-(WIX+WS*8+8,WIY+19),XOR,%255
4180 IF WS<WMX THEN WS=WS+1 : IF WS>WL THEN WL=WL+1
4190 LOCATE WICX+WS-1,WICY : PRINT K$;
4200 LINE (WIX+WS*8,WIY+19)-(WIX+WS*8+8,WIY+19),XOR,%255 : RETURN
4210 '
4220 *カーソル移動処理
4230 LINE (WIX+WS*8,WIY+19)-(WIX+WS*8+8,WIY+19),XOR,%255
4240 WS=WS+(K$=CHR$(&H1D) AND WS>0)-(K$=CHR$(&H1C) AND WS<WL)
4250 LINE (WIX+WS*8,WIY+19)-(WIX+WS*8+8,WIY+19),XOR,%255 : RETURN
4260 '
4270 *一文字前削除処理
4280 IF WS<=0 OR WS<WL THEN RETURN ELSE WL=WL-1 : K$=" "
4290 LINE (WIX+WS*8,WIY+19)-(WIX+WS*8+8,WIY+19),XOR,%255
4300 LOCATE WICX+WS-1,WICY : PRINT K$; : WS=WS-1
4310 LINE (WIX+WS*8,WIY+19)-(WIX+WS*8+8,WIY+19),XOR,%255 : RETURN
4320 '
4330 *入力中止処理
4340 WQK$="Can" : K$="" : RETURN
4350 '
4360 *入力終了処理
4370 WI$="" : FOR Q=1 TO WL
4380 SC=SCREEN(WICX+Q-1,WICY) : IF SC>0 THEN WI$=WI$+CHR$(SC)
4390 NEXT Q
4400 MX1(6)=0 : MY1(6)=0 : MX2(6)=0 : MY2(6)=0 : K$="" : RETURN
4410 '
4420 *ボタン表示
4430 LINE(MX1(BQ)-1,MY1(BQ)-1)-(MX2(BQ),MY2(BQ)),PSET,%5,B
4440 LINE(MX1(BQ),MY1(BQ))-(MX2(BQ)+1,MY2(BQ)+1),PSET,%0,B
4450 LINE(MX1(BQ),MY1(BQ))-(MX2(BQ),MY2(BQ)),PSET,%1,BF
4460 COLOR 0,%0 : SYMBOL(MX1(BQ)+2,MY1(BQ)+2),BM$,1,1,%7,,,5
4470 RETURN
4480 '
4490 *ボタン押す
4500 *ボタン戻す
4510 LINE(MX1(BQ),MY1(BQ))-(MX2(BQ),MY2(BQ)),XOR,%2,BF
4520 RETURN
4530 '
4540 *枠の退避
4550 WFR=INT((WWX3*WWY3+1)/2) : WFRT(WN)=WFRT(WN-1)+WFR : WFR=WFRT(WN-1)
4560 GET@A(CX*16-2,CY*16-2)-(HX*16+1,HY*16+1),WIN,WFR
4570 RETURN
4580 '
4590 *枠の復元
4600 WFR=WFRT(WN-1)
4610 PUT@A(CX*16-2,CY*16-2)-(HX*16+1,HY*16+1),WIN,,,,,WFR
4620 RETURN